package com.mini.util;

import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.List;

/*
 * 类名称: CheckObjectIsNullUtils
 * 类描述: 反射检测实体对象中的属性是否全部有值
 * 创建时间: 2020/12/6 下午6:29
 * 创建人: zhanghuiying
 *
*/
@Slf4j
public class CheckObjectIsNullUtils {
    
    /**
     * 判断对象属性是否全部有值（string／Integer/List类型）
     * @param object
     * @return
     */
    public static boolean objCheckIsNull(Object object){
        Class clazz = (Class)object.getClass(); // 得到类对象
        Field fields[] = clazz.getDeclaredFields(); // 得到所有属性
        boolean flag = true; //定义返回结果，默认为true
        for(Field field : fields){
            field.setAccessible(true);
            Object fieldValue = null;
            Type fieldType=null;
            String fieldName=null;
            try {
                fieldValue = field.get(object); //得到属性值
                fieldType =field.getType();//得到属性类型
                fieldName = field.getName(); // 得到属性名
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            if(fieldValue == null){  //只要有一个属性值为null 就返回false 表示对象属性有为null的
                flag = false;
                break;
            }
            if(fieldType.equals(Integer.class)&& (Integer)fieldValue == 0 ){
                flag = false; //Integer默认属性值为0
                break;
            }
            if(List.class.isAssignableFrom((Class<?>) fieldType)){
                try {
                    Class<?> clzz = fieldValue.getClass();
                    //反射调用获取到list的size方法来获取到集合的大小
                    Method  sizeMethod = clzz.getDeclaredMethod("size");
                    //集合长度
                    int size = (int) sizeMethod.invoke(fieldValue);
                    if (size < 1) {
                        flag = false; //list中条数为0
                        break;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return flag;
    }
    
}